# 机器学习进阶-图像梯度运算-Sobel算子 
# 1. cv2.Sobel(使用Sobel算子进行计算) 
# 2. cv2.convertScalerAbs(将像素点进行绝对值的计算)
import cv2
import matplotlib.pyplot as plt
import numpy as np

# 第一步：加载图片
lena = cv2.imread('lena.png', cv2.IMREAD_GRAYSCALE)

# 第二步：使用cv2.sobel进行sobel算子计算
sobel_x = cv2.Sobel(lena, cv2.CV_64F, 1, 0)
sobel_y = cv2.Sobel(lena, cv2.CV_64F, 0, 1)
sobel_x = cv2.convertScaleAbs(sobel_x)
sobel_y = cv2.convertScaleAbs(sobel_y)
sobel_xy = cv2.addWeighted(sobel_x, 0.5, sobel_y, 0.5, 0)

# 第三步：使用cv2.scharr进行scharr算子计算
scharr_x = cv2.Scharr(lena, cv2.CV_64F, 1, 0)
scharr_y = cv2.Scharr(lena, cv2.CV_64F, 0, 1)
scharr_x = cv2.convertScaleAbs(scharr_x)
scharr_y = cv2.convertScaleAbs(scharr_y)
scharr_xy = cv2.addWeighted(scharr_x, 0.5, scharr_y, 0.5, 0)

# 第四步： 使用cv2.laplacian 拉普拉斯算子计算
lapkacian = cv2.Laplacian(lena, cv2.CV_64F)
lapkacian = cv2.convertScaleAbs(lapkacian)

# 第五步： 对三种结果进行画图
images = [sobel_xy, scharr_xy, lapkacian]
titles = ['SOBEL_XY', 'SCHARR_XY', 'LAPKACIAN']

for i in range(3):
    plt.subplot(2, 3, i + 1)
    plt.imshow(images[i])
    plt.title(titles[i])
plt.show()
